package gr1381.mihailproject;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.text.NumberFormat;

/**
 * @author Mihail Silivonchik, group1381
 * @since 1.03
 * Класс реализует Graphical User Interface <code>(GUI)</code>
 * 
 * @param textLabel панель, располагающаяся на панели basePanel, для хранения двух меток: sizeLabel и saturationLabel
 * @param panelForTextFields панель, располагающаяся на панели basePanel, для хранения двух полей для ввода: sizeField и saturationFiels
 * @param completionPanel панель, располагающаяся на панели basePanel, для хранения двух меток: sizeCheckLabel и saturationCheckLabel
 * @param titleLabel метка для вывода заглавного текста панельки
 * @param sizeLabel метка для вывода текста-представления sizeField
 * @param saturationLabel метка для вывода текста-представления saturationField
 * @param sizeCheckLabel метка для вывода информации об успешности заполнения sizeField
 * @param saturationCheckLabel метка для вывода информации об успешности заполнения saturationField
 * @param sizeField поля для ввода размерности матрицы смежности
 * @param saturationField поля для ввода насыщенности матрицы смежности 
 * @param resultTextArea текстовая область для вывода результатов (матрица смежности+список мостов)
 * @param resultScrollPane панель прокрутки для resultTextArea
 * @param setButton кнопка установки параметров
 * @param createButton кнопка запуска основных операций (генерация матрицы смежности, создание списков, поиск мостов)
 * @param g объект класса Graph
 */
public class MyGUI implements ActionListener
{
    public static void main (String[] args)
    {
        createGUI ();
    }
    
    /**Метод создаёт главный фрейм с настрйоками параметров*/
    public static void createGUI ()
    {
        //создаём фрейм для установки параметров и запуска
        JFrame frameSet = new JFrame ("Настройки");

        MyGUI gui = new MyGUI();
        frameSet.setContentPane(gui.createContentSetPane());
        
        frameSet.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameSet.setSize(400, 300);
        frameSet.setVisible(true);
    }
    
    /**
     * Метод создаёт панели на основном фрейме (frameSet)
     * @return созданную панель
     */
    public JPanel createContentSetPane()
    {
        //главная панель
        JPanel basePanel = new JPanel();
        basePanel.setLayout(null);
        
        titleLabel = new JLabel("Параметры генерации");
        titleLabel.setLocation(0,0);
        titleLabel.setSize(290, 30);
        titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
        titleLabel.setVerticalAlignment(SwingConstants.TOP);
        basePanel.add(titleLabel);
        
        //создаём панель для хранения двух меток sizeLabel и saturationLabel
        textPanel = new JPanel();
        textPanel.setLayout(null);
        textPanel.setLocation(10, 35);
        textPanel.setSize(90, 80);
        basePanel.add(textPanel);
        
        sizeLabel = new JLabel("Размерность");
        sizeLabel.setLocation(0, 0);
        sizeLabel.setSize(90, 40);
        textPanel.add(sizeLabel);
        
        saturationLabel = new JLabel("Насыщенность");
        saturationLabel.setLocation(0, 40);
        saturationLabel.setSize(90, 40);
        textPanel.add(saturationLabel);
        
        //создаём панель для двух полей sizeField и saturationFiels
        panelForTextFields = new JPanel();
        panelForTextFields.setLayout(null);
        panelForTextFields.setLocation(110, 40);
        panelForTextFields.setSize(100, 70);
        basePanel.add(panelForTextFields);
        
        sizeField = new JFormattedTextField (NumberFormat.getIntegerInstance());
        //NumberFormat.getIntegerInstance() - метод возвращает объект для формаатирования целых числен
        sizeField.setColumns(5);
        sizeField.setLocation(0, 0);
        sizeField.setSize(100, 30);
        panelForTextFields.add(sizeField);

        saturationField = new JFormattedTextField (NumberFormat.getIntegerInstance());
        saturationField.setColumns(5);
        saturationField.setLocation(0, 40);
        saturationField.setSize(100, 30);
        panelForTextFields.add(saturationField);
        
        //создаём панель для двух меток sizeCheckLabel и saturationCheckLabel
        completionPanel = new JPanel();
        completionPanel.setLayout(null);
        completionPanel.setLocation(240, 35);
        completionPanel.setSize(140, 80);
        basePanel.add(completionPanel);
        
        sizeCheckLabel = new JLabel("Некорректные данные");
        sizeCheckLabel.setForeground(Color.red);
        sizeCheckLabel.setLocation(0, 0);
        sizeCheckLabel.setSize(140, 40);
        completionPanel.add(sizeCheckLabel);

        saturationCheckLabel = new JLabel("Некорретные данные");
        saturationCheckLabel.setForeground(Color.red);
        saturationCheckLabel.setLocation(0, 40);
        saturationCheckLabel.setSize(140, 40);
        completionPanel.add(saturationCheckLabel);
        
        //добавляем кнопки
        setButton = new JButton("Ввод значений");
        setButton.setLocation(110, 120);
        setButton.setSize(140, 30);
        setButton.addActionListener(this);
        basePanel.add(setButton);
        
        createButton = new JButton ("Выполнение");
        createButton.setLocation(110, 160);
        createButton.setSize(140, 30);
        createButton.setVisible (false);
        createButton.addActionListener(this);
        basePanel.add(createButton);
        
        basePanel.setOpaque(true);
        return basePanel;
    }
    
    /**
     * Метод создаёт панели на основном фрейме (frameSet)
     * @param res сконкантенированная информация о матрице смежности и списке мостов
     * @return созданную панель
     */
    public JPanel createContentResultPane(String res)
    {
        JPanel secondPanel = new JPanel ();
        
        resultTextArea = new JTextArea (res);
        resultTextArea.setEditable(false);
        resultTextArea.setLineWrap(true);
        resultTextArea.setWrapStyleWord(true);
        resultScrollPane = new JScrollPane(resultTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        resultScrollPane.setPreferredSize(new Dimension(300, 200));
        secondPanel.add (resultScrollPane);
        
        secondPanel.setOpaque(true);
        return secondPanel;
    }
    
    /**
     * Обработчик событий
     * @param event событие
     */
    public void actionPerformed(ActionEvent event)
    {
        //обработчик кнопки "setButton"
        if (event.getSource() == setButton)
        {
            //проверяем корректность ввода полей sizeField и saturationField
            if ( Integer.parseInt(sizeField.getText().trim()) > 0 )
            {
                sizeCheckLabel.setForeground(Color.green);
                sizeCheckLabel.setText("Корректные данные!");
            }
            if ( Integer.parseInt(saturationField.getText().trim()) > 0 && Integer.parseInt(saturationField.getText().trim()) <= 100 )
            {
                saturationCheckLabel.setForeground(Color.green);
                saturationCheckLabel.setText("Корректные данные!");
            }

            //если оба поля введены корректно
            if (sizeCheckLabel.getForeground() == Color.green && saturationCheckLabel.getForeground() == Color.green)
            {
                setButton.setEnabled(false);
                createButton.setVisible(true);
            }
        }
        
        //обработчик кнопки "createButton"
        if (event.getSource() == createButton)
        {
            createButton.setEnabled(false);

            g = new Graph ( Integer.parseInt(sizeField.getText().trim()) );
            g.randomAdjacentMatrix ( Integer.parseInt(saturationField.getText().trim()) );
            g.createNode();
            g.setAdjacentList();
            g.findBridges();
            
            String stringMatrixAndBridges = g.convertToStringAdjacentMatrix ();
            stringMatrixAndBridges += "\n" + g.getStringBridges();
            
            //создаём новый фрэйм для индикации результатов
            JFrame frameResult = new JFrame ("Результаты");
            
            MyGUI gui = new MyGUI ();
            frameResult.setContentPane(gui.createContentResultPane(stringMatrixAndBridges));
        
            frameResult.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frameResult.setSize(400, 300);
            frameResult.setVisible(true);
        }
    }


    JPanel textPanel, panelForTextFields, completionPanel;
    JLabel titleLabel, sizeLabel, sizeCheckLabel, saturationLabel, saturationCheckLabel;
    JTextField sizeField, saturationField;
    JTextArea resultTextArea;
    JScrollPane resultScrollPane;
    JButton setButton, createButton;
    Graph g;
}